package Leetcode第二期;

import 多线程.S;

import java.util.*;

/**
 * @author : K k
 * @date : 9:37 2020/9/21
 * 给定一个仅包含数字 2-9 的字符串，返回所有它能表示的字母组合。
 *
 * 给出数字到字母的映射如下（与电话按键相同）。注意 1 不对应任何字母。
 *

 * 示例:
 *
 * 输入："23"
 * 输出：["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
 */
public class 电话号码的字母组合_17 {
    static Map<Character,String> map =new HashMap<>();
    static{
        map.put('2',"abc");
        map.put('3',"def");
        map.put('4',"ghi");
        map.put('5',"jkl");
        map.put('6',"mno");
        map.put('7',"pqrs");
        map.put('8',"tuv");
        map.put('9',"wxyz");
    }

    List<String> res=new ArrayList<>();

    //思路1：dfs
    public List<String> letterCombinations(String digits) {
        if (digits==null || digits.length()==0){return res;}
        dfsSolver("",digits,digits.length(),0);
        System.out.println(res);
        return res;
    }

    private void dfsSolver(String ans, String digits, int len, int index) {
        if(index==len){
            res.add(ans);
            return;
        }

        char c = digits.charAt(index);
        String s = map.get(c);
        for(int i=0;i<s.length();i++){
            dfsSolver(ans+s.charAt(i),digits,len,index+1);
        }
    }


    //思路2：动态规划
    public List<String> letterCombinationsB(String digits) {
        if (digits==null||digits.length()==0){
            return new ArrayList<String>();
        }
        Queue<String> queue=new LinkedList<>();
        String s2 = map.get(digits.charAt(0));
        for(int i=0;i<s2.length();i++){
            queue.add(""+s2.charAt(i));
        }

        for (int i=1;i<digits.length();i++){
            String s = map.get(digits.charAt(i));
           for(int j=queue.size()-1;j>=0;j--){
                String s1 = queue.poll();
               for(int k=0;k<s.length();k++){
                   queue.add(s1+s.charAt(k));
               }
            }
        }
        List<String> ans=new ArrayList<>(queue);
        System.out.println(ans);
        return ans;

    }
    public static void main(String[] args) {
        电话号码的字母组合_17 x=new 电话号码的字母组合_17();
        x.letterCombinationsB("23");
    }
}
